你最愿意做的哪件事,才是你的天赋所在

0%

WireShark 分析网站请求流程

DNS 查询报文和响应报文

  • 当在浏览器中输入网站回车后,浏览器将向本机的DNS模块发送请求。
  • DNS模块是有缓存的,若缓存中有,则直接取ip地址,若没有则向下将DNS发送给UDP
  • UDP协议单元将该数据封装成IP数据包,传递给IP协议单元
  • IP协议单元再进行一层封装,加入DNS服务器的地址
  • 封装好的IP数据包将传递给链路层进行发送
  • 数据链路层发送到DNS服务器,若数据链路层的缓冲区中没有dns服务器的MAC,那么就发送ARP的广播请求等待回应
  • 得到回应之后将ip地址和对应的MAC地址写入APR缓存中,之后进行转发
  • DNS请求被发送到DNS服务器的数据链路层的协议单元
  • DNS服务器的数据链路层的协议单元会解析接收到的关键帧,并讲内部的IP数据包传送给网络层的IP协议单元
  • DNS服务器的IP协议单元解析收到的数据包,然后再向上剥壳,讲UDP数据传递给UDP协议单元
  • UDP将其内部的DNS报文传递给DNS服务单元,然后DNS服务单元解析域名对应IP地址,产生DNS回应报文,再发送给请求地址

image-20200916143737324

TCP 第一次握手和第二次握手

相关资料

TCP(Transmission Control Protocol)传输控制协议

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包;

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

第一次握手

image-20200916150842218

第二次握手

image-20200916150909276

第三次握手

image-20200916150946763

成功建立联系

HTTP 协议过程

在上面已经建立起来了TCP连接,主机向目标发送请求

以bupt.edu.cn为例子

第一个发送的是测试网络状态的请求,web服务器会返回一个版本号和协议状态码,http 200 表示请求成功

image-20200916160813578

image-20200916161408536

若请求头中Connection: keep-alive则 TCP连接不会断开,否则一次http请求结束后TCP连接断开

DNS 发送报文解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Domain Name System (query)
Transaction ID: 0x1c66 # 事物ID
Flags: 0x0100 Standard query # 报文中的标志字段
0... .... .... .... = Response: Message is a query
#QR字段, 值为0,因为是一个请求包
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段,值为0,因为是标准查询
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...1 .... .... = Recursion desired: Do query recursively
#RD字段
.... .... .0.. .... = Z: reserved (0)
# 保留字段值为0
.... .... ...0 .... = Non-authenticated data: Unacceptable
# 保留字段值为0
Questions: 1 # 问题计数, 有1的问题
Answer RRs: 0 # 回答资源记录数
Authority RRs: 0 # 权威名称服务器技术
Additional RRs: 0 # 附加资源记录数
Queries # 问题部分
www.baidu.com: type A, class IN
[Response In: 113]

DNS响应报文解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Domain Name System (response)
Transaction ID: 0x1c66 # 事物ID
Flags: 0x8180 Standard query response, No error # 标志字段
1... .... .... .... = Response: Message is a response
# QR字段, 值为1,因为是响应字段
.000 0... .... .... = Opcode: Standard query (0)
# Opcode字段,值为0,因为是标准查询
.... .0.. .... .... = Authoritative: Server is not an authority for domain
# AA字段,值为0,表示不是权威服务器
.... ..0. .... .... = Truncated: Message is not truncated
# TC字段,表示是否被截断,值为0,没有被截断
.... ...1 .... .... = Recursion desired: Do query recursively
# RD字段, 值为1,做递归查询
.... .... 1... .... = Recursion available: Server can do recursive queries
# RA字段, 可用递归,值为1,表示服务器支持递归查询
.... .... .0.. .... = Z: reserved (0)
# 保留字段 值为0
.... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server
.... .... ...0 .... = Non-authenticated data: Unacceptable
.... .... .... 0000 = Reply code: No error (0) # 返回码字段,
Answer RRs: 3
Authority RRs: 0
Additional RRs: 0
Queries
www.baidu.com: type A, class IN # 问题内容部分
Name: www.baidu.com # 查询名字段
[Name Length: 13]
[Label Count: 3]
Type: A (Host Address) (1) # 查询类型字段 , 此处为A类型
Class: IN (0x0001) # 查询类字段, 此处为互联网地址
Answers
www.baidu.com: type CNAME, class IN, cname www.a.shifen.com
Name: www.baidu.com # 域名字段
Type: CNAME (Canonical NAME for an alias) (5) # 类型字段,此处为CNAME,别名
Class: IN (0x0001) # 类字段
Time to live: 974 (16 minutes, 14 seconds) # 生存时间
Data length: 15 # 数据长度
CNAME: www.a.shifen.com # 资源数据
www.a.shifen.com: type A, class IN, addr 61.135.169.121
Name: www.a.shifen.com
Type: A (Host Address) (1) # 类型字段,此处为A类型,IP地址
Class: IN (0x0001)
Time to live: 297 (4 minutes, 57 seconds)
Data length: 4 # 数据长度
Address: 61.135.169.121 # 资源数据,IP地址

[Request In: 110]
[Time: 0.001160600 seconds]

TCP报文解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Transmission Control Protocol, Src Port: 47594, Dst Port: 443, Seq: 0, Len: 0
Source Port: 47594 # 源端口号
Destination Port: 443 # 目的端口号
[Stream index: 9]
[TCP Segment Len: 0]
Sequence number: 0 (relative sequence number) # 序列号SN 32bit
Sequence number (raw): 1463572171
[Next sequence number: 1 (relative sequence number)]
Acknowledgment number: 0 # 应答号Ack 32bit
Acknowledgment number (raw): 0
1010 .... = Header Length: 40 bytes (10) # 头长4bit
Flags: 0x002 (SYN) # 标志位8bit
000. .... .... = Reserved: Not set # 保留字段
...0 .... .... = Nonce: Not set
.... 0... .... = Congestion Window Reduced (CWR): Not set #拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
.... .0.. .... = ECN-Echo: Not set #用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN 功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
.... ..0. .... = Urgent: Not set #表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
.... ...0 .... = Acknowledgment: Not set #表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
.... .... 0... = Push: Not set #PSH告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
.... .... .0.. = Reset: Not set #RST表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
.... .... ..1. = Syn: Set #SYN在建立连接时使用,用来同步序号。当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;当 SYN=1,ACK=1 时,表示对方同意建立连接。SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
[Expert Info (Chat/Sequence): Connection establish request (SYN): server port 443]
.... .... ...0 = Fin: Not set #标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
[TCP Flags: ··········S·]
Window size value: 64240 #窗口大小(Window Size):占 16 位。它表示从 Ack Number 开始还可以接收多少字节的数据量,也表示当前接收端的接收窗口还有多少剩余空间。该字段可以用于 TCP 的流量控制。
[Calculated window size: 64240]
Checksum: 0xdaa6 [unverified] #校验位(TCP Checksum):占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。Checksum 是根据伪头 + TCP 头 + TCP 数据三部分进行计算的。
[Checksum Status: Unverified]
Urgent pointer: 0 #仅当前面的 URG 控制位为 1 时才有意义。它指出本数据段中为紧急数据的字节数,占 16 位。当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
Options: (20 bytes), Maximum segment size, SACK permitted, Timestamps, No-Operation (NOP), Window scale #可选字段,长度不定,但长度必须是 32bits 的整数倍。
TCP Option - Maximum segment size: 1460 bytes
Kind: Maximum Segment Size (2)
Length: 4
MSS Value: 1460
TCP Option - SACK permitted
Kind: SACK Permitted (4)
Length: 2
TCP Option - Timestamps: TSval 3296911711, TSecr 0
Kind: Time Stamp Option (8)
Length: 10
Timestamp value: 3296911711
Timestamp echo reply: 0
TCP Option - No-Operation (NOP)
Kind: No-Operation (1)
TCP Option - Window scale: 7 (multiply by 128)
Kind: Window Scale (3)
Length: 3
Shift count: 7
[Multiplier: 128]
[Timestamps]

HTTP 报文分析

HTTP请求报文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Hypertext Transfer Protocol
GET / HTTP/1.1\r\n
[Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n]
[GET / HTTP/1.1\r\n]
[Severity level: Chat]
[Group: Sequence]
Request Method: GET # 请求方法,GET,POST,HEAD
Request URI: / # Uniform Resource Identifiers的缩写,它是URL的一种扩展,我们在HTTP协议中使用的URI其实都是URL。
Request Version: HTTP/1.1 # 协议版本 HTTP1.1
Host: www.bupt.edu.cn\r\n # 接受请求的服务器地址
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36\r\n
# User-Agent是指发出请求的应用程序。实际使用的是Chrome浏览器。
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n #Accept-Encoding表示客户端可以接受的压缩格式。
Accept-Language: zh-CN,zh;q=0.9\r\n #Accept-Language表示客户端接受的语言类型。
Cache-Control: max-age=0\r\n #指定客户端对网页的缓存策略。
Connection: close\r\n # 表示是否需要持久连接,“Keep - Alive”
Cookie: JSESSIONID=5EABFC207C5F9F4E8A217A1F172F9C39\r\n
Cookie pair: JSESSIONID=5EABFC207C5F9F4E8A217A1F172F9C39 #常用来表示请求者的身份。
Upgrade-Insecure-Requests: 1\r\n # 该指令控制http与https之间的过渡
\r\n
[Full request URI: http://www.bupt.edu.cn/]
[HTTP request 1/1]
[Response in frame: 237]

HTTP响应报文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
[Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
[HTTP/1.1 200 OK\r\n]
[Severity level: Chat]
[Group: Sequence]
Response Version: HTTP/1.1 # 响应协议版本HTTP1.1
Status Code: 200 # 响应状态码
[Status Code Description: OK]
Response Phrase: OK
Server: none\r\n # 服务器软件版本
Date: Mon, 19 Oct 2020 07:57:41 GMT\r\n # 标注了当前服务器的时间
Content-Type: text/html\r\n # 表示响应的格式类型
Transfer-Encoding: chunked\r\n # 消息首部指明了将 entity 安全传递给用户所采用的编码形式。
Connection: close\r\n # 标明连接关闭,抓包可以发现在响应返回后服务器向客户端发出fin包单向关闭了连接
X-Frame-Options: SAMEORIGIN\r\n #指示允许一个页面 可否在 <frame>, <iframe>, <embed> 或者 <object> 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking 攻击。
Vary: User-Agent,Accept-Encoding\r\n #是一个HTTP响应头部信息,它决定了对于未来的一个请求头,应该用一个缓存的回复(response)还是向源服务器请求一个新的回复。它被服务器用来表明在 content negotiation algorithm(内容协商算法)中选择一个资源代表的时候应该使用哪些头部信息(headers).
Cache-Control: private, max-age=600\r\n #通用消息头字段,被用于在http请求和响应中,通过指定指令来实现缓存机制。缓存指令是单向的,这意味着在请求中设置的指令,不一定被包含在响应中。
Expires: Mon, 19 Oct 2020 08:06:13 GMT\r\n #表示在某个时间以前可以不用重新缓存该页面
Content-Language: zh-CN\r\n # 内容语言
Content-Encoding: gzip\r\n # 内容编码格式,浏览器解码
\r\n
[HTTP response 1/1]
[Time since request: 0.007112795 seconds]
[Request in frame: 206]
[Request URI: http://www.bupt.edu.cn/]
HTTP chunked response
Content-encoded entity body (gzip): 16303 bytes -> 64231 bytes
File Data: 64231 bytes # 文件大小
-------------你最愿意做的哪件事才是你的天赋所在-------------